export const nebulaWordsUppercase = [
  'ACROSS',
  'ADD',
  'ALTER',
  'AND',
  'AS',
  'ASC',
  'ASCENDING',
  'BALANCE',
  'BOOL',
  'BY',
  'CASE',
  'CHANGE',
  'COMPACT',
  'CREATE',
  'DATE',
  'DATETIME',
  'DELETE',
  'DESC',
  'DESCENDING',
  'DESCRIBE',
  'DISTINCT',
  'DOUBLE',
  'DOWNLOAD',
  'DROP',
  'DURATION',
  'EDGE',
  'EDGES',
  'EXISTS',
  'EXPLAIN',
  'FETCH',
  'FIND',
  'FIXED_STRING',
  'FLOAT',
  'FLUSH',
  'FORMAT',
  'FROM',
  'GET',
  'GO',
  'GRANT',
  'IF',
  'IGNORE_EXISTED_INDEX',
  'IN',
  'INDEX',
  'INDEXES',
  'INGEST',
  'INSERT',
  'INT',
  'INT16',
  'INT32',
  'INT64',
  'INT8',
  'INTERSECT',
  'IS',
  'LIMIT',
  'LIST',
  'LOOKUP',
  'MAP',
  'MATCH',
  'MINUS',
  'NO',
  'NOT',
  'NOT_IN',
  'NULL',
  'OF',
  'OFFSET',
  'ON',
  'OR',
  'ORDER',
  'OVER',
  'OVERWRITE',
  'PROFILE',
  'PROP',
  'REBUILD',
  'RECOVER',
  'REMOVE',
  'RESTART',
  'RETURN',
  'REVERSELY',
  'REVOKE',
  'SET',
  'SHOW',
  'STEP',
  'STEPS',
  'STOP',
  'STRING',
  'SUBMIT',
  'TAG',
  'TAGS',
  'TIME',
  'TIMESTAMP',
  'TO',
  'UNION',
  'UPDATE',
  'UPSERT',
  'UPTO',
  'USE',
  'VERTEX',
  'VERTICES',
  'WHEN',
  'WHERE',
  'WITH',
  'XOR',
  'YIELD',
  'ACCOUNT',
  'ADMIN',
  'ALL',
  'ANY',
  'ATOMIC_EDGE',
  'AUTO',
  'BIDIRECT',
  'BOTH',
  'CHARSET',
  'CLIENTS',
  'COLLATE',
  'COLLATION',
  'COMMENT',
  'CONFIGS',
  'CONTAINS',
  'DATA',
  'DBA',
  'DEFAULT',
  'ELASTICSEARCH',
  'ELSE',
  'END',
  'ENDS',
  'ENDS_WITH',
  'FORCE',
  'FULLTEXT',
  'FUZZY',
  'GOD',
  'GRAPH',
  'GROUP',
  'GROUPS',
  'GUEST',
  'HDFS',
  'HOST',
  'HOSTS',
  'INTO',
  'IS_EMPTY',
  'IS_NOT_EMPTY',
  'IS_NOT_NULL',
  'IS_NULL',
  'JOB',
  'JOBS',
  'KILL',
  'LEADER',
  'LISTENER',
  'META',
  'NOLOOP',
  'NONE',
  'NOT_CONTAINS',
  'NOT_ENDS_WITH',
  'NOT_STARTS_WITH',
  'OPTIONAL',
  'OUT',
  'PART',
  'PARTITION_NUM',
  'PARTS',
  'PASSWORD',
  'PATH',
  'PLAN',
  'PREFIX',
  'QUERIES',
  'QUERY',
  'REDUCE',
  'REGEXP',
  'REPLICA_FACTOR',
  'RESET',
  'ROLE',
  'ROLES',
  'SAMPLE',
  'SEARCH',
  'SERVICE',
  'SESSION',
  'SESSIONS',
  'SHORTEST',
  'SIGN',
  'SINGLE',
  'SKIP',
  'SNAPSHOT',
  'SNAPSHOTS',
  'SPACE',
  'SPACES',
  'STARTS',
  'STARTS_WITH',
  'STATS',
  'STATUS',
  'STORAGE',
  'SUBGRAPH',
  'TEXT',
  'TEXT_SEARCH',
  'THEN',
  'TOP',
  'TTL_COL',
  'TTL_DURATION',
  'UNWIND',
  'USER',
  'USERS',
  'UUID',
  'VALUE',
  'VALUES',
  'VID_TYPE',
  'WILDCARD',
  'ZONE',
  'ZONES',
  'FALSE',
  'TRUE',
];

export const ban = ['use', 'USE'];

export const operators = [
  // Bitwise Operator
  '&',
  '|',
  '^',
  // Math
  'abs',
  'floor',
  'ceil',
  'round',
  'sqrt',
  'cbrt',
  'hypot',
  'pow',
  'exp',
  'exp2',
  'log',
  'log2',
  'sin',
  'asin',
  'cos',
  'acos',
  'tan',
  'atan',
  'rand32',
  'rand64',
  // String
  'strcasecmp',
  'lower',
  'upper',
  'length',
  'trim',
  'ltrim',
  'rtrim',
  'left',
  'right',
  'lpad',
  'rpad',
  'substr',
  'hash',
  // Timestamp
  'now',
  // Comparison Functions And Operators
  '=',
  '/',
  '==',
  '!=',
  '<',
  '<=',
  '-',
  '%',
  '+',
  '*',
  '-',
  'udf_is_in',
  // Aggregate
  'AVG',
  'COUNT',
  'MAX',
  'MIN',
  'STD',
  'SUM',
  // Logical Operator
  '&&',
  '!',
  '||',
  'XOR',
  // Order by Function
  'ORDER',
  'BY',
  'DESC',
  'ASC',
  // Limit
  'LIMIT',
  // Set Operations
  'UNION',
  'INTERSECT',
  'MINUS',
  // uuid
  'uuid',
  // assignment
  '=>',
  'IS Null',
  'IS NOT NULL',
  'IS EMPTY',
  'IS NOT EMPTY',
];

export const propertyReference = ['$^', '$$', '$-'];

export const parameterDeclaration = [':PARAM', ':PARAMS'];
const mathFunctions = [
  'abs',
  'floor',
  'ceil',
  'round',
  'sqrt',
  'cbrt',
  'hypot',
  'pow',
  'exp',
  'exp2',
  'log',
  'log2',
  'log10',
  'sin',
  'asin',
  'cos',
  'acos',
  'tan',
  'atan',
  'rand',
  'rand32',
  'rand64',
  'bit_and',
  'bit_or',
  'bit_xor',
  'size',
  'range',
  'sign',
  'e',
  'pi',
  'radians',
];
const staticFunctions = ['avg', 'count', 'max', 'min', 'collect', 'std', 'sum'];

const stringFunctions = [
  'strcasecmp',
  'lower',
  'toLower',
  'upper',
  'toUpper',
  'length',
  'trim',
  'ltrim',
  'rtrim',
  'left',
  'right',
  'lpad',
  'rpad',
  'substr',
  'substring',
  'reverse',
  'replace',
  'split',
  'concat',
  'concat_ws',
  'extract',
  'json_extract',
];
const dateFunctions = ['now', 'date', 'time', 'datetime', 'timestamp', 'duration'];
const schemaFunctions = [
  'id',
  'properties',
  'type',
  'rank',
  'src',
  'dst',
  'tags',
  'labels',
  'typeid',
  'startNode',
  'endNode',
];
const listFunctions = [
  'range',
  'reverse',
  'tail',
  'head',
  'last',
  'reduce',
  'keys',
  'labels',
  'nodes',
  'relationships',
];

const typeConvertFunctions = ['toBoolean', 'toFloat', 'toString', 'toInteger', 'toSet', 'hash'];
const conditionalFunctions = ['coallesce'];
const predicateFunctions = ['exists', 'any', 'all', 'none', 'single'];
const geoFunctions = [
  'ST_Point',
  'ST_GeogFromText',
  'ST_ASText',
  'ST_Centroid',
  'ST_ISValid',
  'ST_Intersects',
  'ST_Covers',
  'ST_CoveredBy',
  'ST_DWithin',
  'ST_Distance',
  'S2_CellIdFromPoint',
  'S2_CoveringCellIds',
];

export const nebulaFunction = [
  ...mathFunctions,
  ...staticFunctions,
  ...stringFunctions,
  ...dateFunctions,
  ...schemaFunctions,
  ...listFunctions,
  ...typeConvertFunctions,
  ...conditionalFunctions,
  ...predicateFunctions,
  ...geoFunctions,
];
const nebulaWordsLowercase = nebulaWordsUppercase.map((w) => w.toLowerCase());

export const keyWords = [...nebulaWordsUppercase, ...nebulaWordsLowercase];

export const maxLineNum = 5;
